﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Data;  // reference tilføjet, så jeg kan bruge database

using System.Data.SqlClient; //Giver mulighed for at lave forbindelse til DB. 
using System.Data.SqlTypes; //Giver programmet mulighed for at genkende mssql's indbyggede data typer.

using Interfaces;  // den eneste del af solution database-facaden skal kunne kende (udover frisørsystem)



namespace Controller
{
    class DBFacade
    {
        private SqlConnection con;  // De 2 vigtige variable til brug af db
        private SqlCommand cmd;

        private FrisørSystem frisørsystem;

        public DBFacade(FrisørSystem frisørsystem)
        {
            this.frisørsystem = frisørsystem;   // Associering til controller

            // ok - man kan skrive \. i stedet for at skrive navnet på sin pc
            string connectionStr = @"Data Source=KRISTIAN-PC;Initial catalog=Frisørsystem;Integrated Security=SSPI";
            // Skab forbindelses-objekt udfra connectionStr
            con = new SqlConnection(connectionStr);

            // Skab kommando-objekt og tilknyt til forbindelses-objekt
            cmd = new SqlCommand();
            cmd.Connection = con;
            cmd.CommandType = CommandType.StoredProcedure;     // Kommandotype er Stored Procedure
        }


        public List<DataTable> IndlæsFraDatabasen()
        {
           // IndlaesVarer();
            List<DataTable> SamledeTabeller = new List<DataTable>();

            SamledeTabeller.Add(IndlaesVarer());//Tilføj varetabellen til listen over taeller
            //Husk at den er en C# DataTable vi håndterer her, IKKE EN SQLTABEL :S

            // TODO:
            // IndlæsOrdrer(ordrenrListe);
            // IndlæsOrdrelinier(ordrernrListe);

             return SamledeTabeller;
        }

        #region *************** Metoder til varer *****************
        
        private DataTable IndlaesVarer()
        {
            //SqlDataReader datareader = null; // skal referere til den indlæste data
            SqlDataAdapter sqlda = new SqlDataAdapter();

            //long varenr;
            //uint beholdning;
            //double pris;
            //string betegnelse;

            cmd.Parameters.Clear();    // Husk selvom der ikke bruges parametre!!!

            cmd.CommandText = "LæsVarer";
            sqlda.SelectCommand = cmd;  //giv SQLadapteren den kommando OG forindelse den skal bruge.
            DataTable Tvarer = new DataTable();
            try
            {
                con.Open();             // Åben forbindelsen til databasen

                sqlda.Fill(Tvarer); //Bed SQLadapteren udfører kommandoen og udfylde tabellen
                                    //Kommandoen har vi bedt eksekvere den stored procedure der hedder "LæsVare"

                //datareader = cmd.ExecuteReader();

                //// Gennemløb datareader (result set)
                //while (datareader.Read() == true)
                //{
                //    varenr = (long)datareader["varenr"];
                //    betegnelse = (string)datareader["betegnelse"];
                //    pris = (double)datareader["pris"];
                //    beholdning = Convert.ToUInt32(datareader["beholdning"]);

                //    frisørsystem.OpretVareModel(varenr, betegnelse, pris, beholdning);    // Opret varen i modellen
                //}
            }
            catch (SqlException ex)
            {
                throw ex; // NB: læg mærke til, at jeg sender exception videre op i programmet
                          // jeg fanger exception når den er boblet op til FrmHovedmenu
            }
            finally
            {
                //// close the reader
                //if (datareader != null)
                //{
                //    datareader.Close();
                //}
                //// Close the connection
                if (con.State == ConnectionState.Open)   
                {
                    con.Close();
                }
                //Fjern adapteren
                if (sqlda != null)
                {
                    sqlda.Dispose();
                }

            }
            return Tvarer;
        }

        public long OpretVare(string betegnelse, double pris)
        {
            long vareNr = -1; // jeg giver negativt varenr - viser, at det er gået galt

            cmd.CommandText = "OpretVare";

            cmd.Parameters.Clear();

            // Sæt værdier i parametre
            SqlParameter par = new SqlParameter("@varenr", SqlDbType.BigInt); // bemærk varenumrene ligger i så vi kan bruge identity i tabellen
            par.Direction = ParameterDirection.Output;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@betegnelse", SqlDbType.NVarChar);
            par.Value = betegnelse;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@pris", SqlDbType.Float);
            par.Value = pris;
            cmd.Parameters.Add(par);

            try
            {
                con.Open();             // Åben forbindelsen til databasen
                cmd.ExecuteNonQuery();   // Udfør kommando
                vareNr = (long) cmd.Parameters["@varenr"].Value;

            }
            catch (SqlException excep)
            {
                throw excep ;
            }
            finally
            {
                if (con.State == ConnectionState.Open)          // Luk forbindelsen
                    con.Close();  // close the connection
            }
            return vareNr;
        }

        public bool RetVare(long varenr, string betegnelse, double pris)
        {
            int NoOfRowsEffected;

            cmd.CommandText = "RetVare";

            cmd.Parameters.Clear();

            // Sæt værdier i parametre
            SqlParameter par = new SqlParameter("@varenr", SqlDbType.BigInt);
            par.Value = varenr;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@betegnelse", SqlDbType.NVarChar);
            par.Value = betegnelse;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@pris", SqlDbType.Float);
            par.Value = pris;
            cmd.Parameters.Add(par);

            try
            {
                con.Open();             // Åben forbindelsen til databasen
                NoOfRowsEffected = cmd.ExecuteNonQuery();   // Udfør kommando
                con.Close();             // Luk forbindelsen
            }                  
            catch (SqlException excep)
            {
                throw excep ;
            }
            finally
            {
                if (con.State == ConnectionState.Open)          // Hvis forbindelsen er åben
                    con.Close();  // close the connection
            }
            return (NoOfRowsEffected == 1);
        }

        public bool SletVare(long varenr)
        {
            int NoOfRowsEffected;

            cmd.CommandText = "SletVare";

            cmd.Parameters.Clear();

            // Sæt værdier i parametre
            SqlParameter par = new SqlParameter("@varenr", SqlDbType.BigInt);
            par.Value = varenr;
            cmd.Parameters.Add(par);

            try
            {
                con.Open();             // Åben forbindelsen til databasen
                NoOfRowsEffected = cmd.ExecuteNonQuery();   // Udfør kommando
                con.Close();             // Luk forbindelsen
            }                  
            catch (SqlException excep)
            {
                throw excep ;
            }
            finally
            {
                if (con.State == ConnectionState.Open)          // Hvis forbindelsen er åben
                    con.Close();  // close the connection
            }
            return (NoOfRowsEffected == 1);
        }


        public bool JusterVarebeholdning(long varenr, uint ændring)
        {
            int NoOfRowsEffected;

            cmd.CommandText = "JusterBeholdning";

            cmd.Parameters.Clear();

            // Sæt værdier i parametre
            SqlParameter par = new SqlParameter("@varenr", SqlDbType.BigInt);
            par.Value = varenr;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@ændring", SqlDbType.Int);
            par.Value = Convert.ToUInt32(ændring);
            cmd.Parameters.Add(par);

            try
            {
                con.Open();             // Åben forbindelsen til databasen
                NoOfRowsEffected = cmd.ExecuteNonQuery();   // Udfør kommando
                con.Close();             // Luk forbindelsen
            }
            catch (SqlException excep)
            {
                throw excep;
            }
            finally
            {
                if (con.State == ConnectionState.Open)          // Hvis forbindelsen er åben
                    con.Close();  // close the connection
            }
            return (NoOfRowsEffected == 1);
        }

    }
        #endregion
}
